package com.core.common.manger.storage;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RandomUtil;
import com.core.common.cons.FileTypeEnum;
import com.google.common.io.Files;
import lombok.Data;
import org.springframework.core.io.Resource;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.util.Objects;
import java.util.stream.Stream;

/**
 * @program: kuntail
 * @description: 文件服务
 * @author: honglei
 * @create: 2022-06-10 15:47
 */
public interface IStorageService {
    String getActive();



    default FileMate createTempMate(byte[] data, String fileSuffixName) {
        FileMate mate=generateFileMateWith(null,fileSuffixName);
        FileUtil.writeBytes(data,mate.getFilePath());
        return mate;
    }


    /****
     * 保存文件
     * @param data
     * @param fileSuffixName
     * @return
     */
    default  FileMate store(byte[] data, String fileSuffixName){
        InputStream stream= new ByteArrayInputStream(data);
        return store(stream,data.length,fileSuffixName);
    }


    /**
     * 存储一个文件对象
     *
     * @param inputStream   文件输入流
     * @param contentLength 文件长度
     * @param keyName       文件名包含后缀
     */
    FileMate store(InputStream inputStream, long contentLength,  String keyName);








    /***
     * 生成本地临时文件
     * @param fileDir  文件前置路径
     * @param fileSuffixi  文件名称[后缀]
     * @return
     */
    default FileMate generateFileMateWith(String fileDir,String fileSuffixi){

        String relatePath="static";
        if (fileSuffixi.indexOf(".") == -1){ // 不包含.说明是纯文件类型后缀
            fileSuffixi="."+fileSuffixi;
        }

        if (fileSuffixi.indexOf(".")  < 1){// 点前无内容，不存在文件名需要生成
            synchronized (this){
                fileSuffixi=System.currentTimeMillis()+"-"+ RandomUtil.randomString(4) +fileSuffixi;
            }
        }
        if (Objects.nonNull(fileDir)){ //存在相对路径
            if (! fileDir.startsWith("/")){
                fileDir=File.separator+fileDir;
            }
            relatePath += fileDir;
        }
        if (! relatePath.endsWith("/")){
            relatePath += "/";
        }
       // relatePath=relatePath+fileSuffixi;
        String absolutePath = System.getProperty("user.dir")+File.separator+relatePath+fileSuffixi;
        File file=new File(absolutePath);
        if (! file.exists()){
            file.getParentFile().mkdirs();
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileMate fileMate=new FileMate();
        fileMate.setFileKey(fileSuffixi);
        fileMate.setFilePath(absolutePath);
        fileMate.setFileDir(relatePath);
        fileMate.setFileType(Files.getFileExtension(absolutePath));
        return fileMate;
    }









    Path load(String keyName);

    Resource loadAsResource(String keyName);

    void delete(String keyName);






    @Data
    public static class FileMate{
        private String fileUrl;//文件url
        private String fileKey;//文件唯一码
        private String filePath;//文件存储全路径
        private String fileDir;//相对地址
        private Long fileLength;//文件大小
        private String fileType;//文件类型
    }


    default  String getContentTypeBy(String fileName){
        String suffixName  = fileName.substring(fileName.lastIndexOf("."));
        for (FileTypeEnum value : FileTypeEnum.values()) {
            if (value.getFileType().contains(suffixName)){
                return value.getContentType();
            }
        }

        return "application/octet-stream";
    }

}
